/*
 * Copyright (c) 2022  by Junzhao
 * THIS FILE IS PART OF JAVA-Data-Structures-and-Algorithms PROJECT
 * All Rights Reserved.
 */

package 简单数组栈;

/**
 * @Description 栈
 * 栈的英文为(stack)
 * 栈是一个先入后出(FILO - First In Last Out)的有序列表。
 * 1 栈(stack)是限制线性表中元素的插入和删除只能在线性表的同一端进行的一种特殊线性表。
 * 2 允许插入和删除的一端，为变化的一端，称为栈顶(Top)，另一端为固定的一端，称为栈底(Bottom)。
 * 3 根据栈的定义可知，最先放入栈中元素在栈底，最后放入的元素在栈顶，而删除元素刚好相反，
 * 4 最后放入的元素最先删除，最先放入的元素最后删除
 * 5 出栈(pop)和入栈(push)的概念
 * <p>
 * 栈的应用场景
 * 1 子程序的调用：在跳往子程序前，会先将下个指令的地址存到堆栈中，直到子程序执行完后再将地址取出，以回到原来的程序中。
 * 2 处理递归调用：和子程序的调用类似，只是除了储存下一个指令的地址外，也将参数、区域变量等数据存入堆栈中。
 * 3 表达式的转换[中缀表达式转后缀表达式]与求值(实际解决)。
 * 4 二叉树的遍历。
 * 5 图形的深度优先(depth一first)搜索法。
 * <p>
 * 实现 栈的 思路分析
 * 1. 使用数组来模拟栈
 * 2. 定义一个 top  来表示栈顶，初始化 为  -1
 * 3. 入栈的操作，当有数据加入到栈时， top++;  stack[top] = data;
 * 4. 出栈的操作， int value = stack[top]; top--, return value
 * @Author 俊昭
 * @Date 2022/4/28
 */
public class ArrayStack {
    //    private static int bottom = -1;// 栈底
    private static int top = - 1;// 栈顶
    private final int[] stack;

    public ArrayStack(int stackSize) {
        stack = new int[stackSize];
    }

    /**
     * @param data 存入栈的数据
     * @description 入栈
     * @author 俊昭
     * @date 2022/4/29
     */
    public void push(int data) {
        if ((top + 1) < stack.length) {
            top++;
            stack[top] = data;
        } else {
            throw new RuntimeException("爆栈！");
        }
    }

    /**
     * @return value 栈顶的值
     * @description 出栈
     * @author 俊昭
     * @date 2022/4/29
     */
    public int pop() {
        if (top >= 0) {
            int value = stack[top];
            top--;
            return value;
        } else {
            throw new RuntimeException("空栈！");
        }
    }

    public boolean isEmpty() {
        return top == - 1;
    }

    /**
     * @description 由下到上遍历栈
     * @author 俊昭
     * @date 2022/4/29
     */
    public void showInOrder() {
        if (top == - 1) {
            System.out.println("空栈");
        } else {
            for (int i = 0; i <= top; i++) {
                System.out.print(stack[i] + " ");
            }
            System.out.println("\n");
        }
    }

    /**
     * @description 由上到下遍历栈
     * @author 俊昭
     * @date 2022/4/29
     */
    public void showReversed() {
        if (top == - 1) {
            System.out.println("空栈");
        } else {
            for (int i = top; i >= 0; i--) {
                System.out.print(stack[i] + " ");
            }
            System.out.println("\n");
        }
    }


}
